// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
const crypto = require('crypto');
const collectionName = "admin" ;
// 加密方法
function encryptPassword(password) {
  const salt = crypto.randomBytes(16).toString('hex');
  const hash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
  return {salt,hash  };
}
// 验证方法
function verifyPassword(password, hashedPassword, salt) {
  const hash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
  return hash === hashedPassword;
}
module.exports = {
	_before: function () { // 通用预处理器

	},
	//发送短信 验证码
	sendSms(tel,code,expMinute=5,templateId='18696'){
		return uniCloud.sendSms({
			appid: '__UNI__8A62930',
			smsKey: '976dce0a3dadb0c58fa62dec0b79abe1',
			smsSecret: 'ec734e60644e2fb7df6f9133bca4c85d',
			phone: tel,
			templateId: templateId, // 模板id
			data: {
				code: code,
				expMinute: expMinute,
			}
		})
	},
	/**
	 * 查询Admin
	 * @returns {object} 返回admin表内容
	 */
	async getAdmin() {
		// 参数校验，如无参数则不需要
		if (false) return {errCode: 'PARAM_IS_NULL',errMsg: '参数不能为空'} ;
		const db = uniCloud.databaseForJQL() ;
		try{
			const data = await db.collection(collectionName).get({getCount:true});
			// 返回结果
			return {code:200,message:"获取成功",  result:data  }
		}catch(error){
			// 返回结果
			return {message:'内部错误',error }
		}
	},
	/** - 添加admin数据
	 * @param data 要添加的数据
	 * @return {object} 返回添加成功/失败数据 
	 * */
	async addAdmin( data ){
		// 参数校验，如无参数则不需要
		if (!data) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			data.password  = await encryptPassword(data.password) ;
			data.last_login_date = null;
			data.last_login_ip = null;
			const result = await db.collection(collectionName).add(data) ;
			// 返回结果
			return { code:200,message:"添加成功",result:result }
		}catch(error){
			// 返回结果
			return {message:'内部错误',error:error}
		}
	},
	/** - 密码登录
	 * @param data 用户名和密码
	 * @return {object} 返回登录状态 添加成功/失败数据 
	 * */
	async loginPassword(data){
		if (!data) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			let user = await db.collection(collectionName).where({username:data.username}).field("_id,username,password,last_login_date,nickname,mobile,status,role").get()
			if(user.affectedDocs == 0) return { code:1001,message:"用户名不存在",result:user } ; // 用户名不存中
			user = user.data[0];
			if(user.status != 1) return { code:1001,message:"账号已停用",result:user } ; // 账号已停用
			const isPassword = verifyPassword(data.password,user.password.hash,user.password.salt);
			if( !isPassword )  return { code:1001,message:"密码错误" ,error:isPassword } ; // 密码错误
			const clientInfo = this.getClientInfo()
			const loginData = {
				last_login_date:Date.now(),
				last_login_ip:clientInfo.clientIP
			};
			let update = await db.collection(collectionName).where({username:data.username}).update(loginData);
			// 返回结果
			delete user.password ;
			return { code:200,message:"登录成功",url:'/pages/index/index' ,result:user }
		}catch(error){
			// 返回结果
			return {message:'内部错误',error:error}
		}
	},
	/** - 手机号登录
	 * @param data 手机号
	 * @return {object} 返回登录状态 添加成功/失败数据 
	 * */
	async loginMobile(data){
		if (!data) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			let user = await db.collection(collectionName).where({mobile:data.mobile}).field("_id,username,last_login_date,nickname,mobile,status,role").get()
			if(user.affectedDocs == 0) return { code:1001,message:"非管理员手机号",result:user } ; // 用户名不存中
			user = user.data[0];
			if(user.status != 1) return { code:1001,message:"账号已停用",result:user } ; // 账号已停用
			
			const clientInfo = this.getClientInfo()
			const loginData = {
				last_login_date:Date.now(),
				last_login_ip:clientInfo.clientIP
			};
			let update = await db.collection(collectionName).where({username:data.username}).update(loginData);
			// 返回结果
			return { code:200,message:"登录成功",url:'/pages/index/index' ,result:user }
		}catch(error){
			// 返回结果
			return {message:'内部错误',error:error}
		}
	},
	/** - 校验手机号是否存在
	 * @param mobile 手机号
	 * @return {object} 返回是否存在
	 * */
	async PhoneNumberValidator(mobile){
		if (!mobile) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			let user = await db.collection(collectionName).where({mobile:mobile}).field("_id,nickname,mobile").get()
			if(user.affectedDocs == 0) return { code:1001,message:"非管理员手机号",data:false } ; // 用户名不存中
			return {
				code:200,message:'校验成功',data:true
			}
		}catch(error){
			// 返回结果
			return {message:'内部错误',error:error}
		}
	},
	
	/**
	 * 获取Admin修改默认数据
	 * @param uid 数据的_id
	 * @returns {object} 返回Admin表内容
	 */
	async getAdminOne(uid) {
		// 参数校验，如无参数则不需要
		if (!uid) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			let field = "username,password,nickname,mobile,role,tags,status,manage_area,last_login_date,last_login_ip,register_date";
			let data = await db.collection(collectionName).doc(uid).field(field).get({getOne:true}) ;
			data = data.data ;
			// 返回结果
			return {code:200,message:"获取成功",result:data }
		}catch(error){
			// 返回结果
			return {
				message:'内部错误',error }
		}
	},
	
	/**
	 * 修改数据
	 * @param data 要修改的数据
	 * @param uid  修改条件
	 * @returns {object} 返回admin修改容成功数据	 */
	async updateAdmin(data,uid) {
		// 参数校验，如无参数则不需要
		if (!data,!uid) return {errCode: 'PARAM_IS_NULL',errMsg: '参数不能为空'} ;
		const db = uniCloud.database() ;
		const collectionName = "admin" ;
		try{
			delete data._id ; // 删除_id
			
			if(data.password){
				data.password  = await encryptPassword(data.password) ;
			}else{
				delete data.password ;
			}
			const result = await db.collection(collectionName).doc(uid).update(data) ;
			// 返回结果
			return {code:200,message:"修改成功",result:result}
		}catch(error){
			// 返回结果
			return {message:'内部错误',error }
		}
	},
	/**
	 * 删除admin数据
	 * @param uid String 数据的_id 
	 * @returns {object} 返回admin删除成功信息
	 */
	async deleteAdmin(uid) {
		// 参数校验，如无参数则不需要
		if (!uid) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			if(uid == '66d91a893f1a47637377985e'){
				return { code:1001,message:"超级管理员不可被删除" }
			}
			const data = await db.collection(collectionName).doc(uid).remove() ;
			// 返回结果
			return { code:200,message:"删除成功",result:data }
		}catch(error){
			// 返回结果
			return {message:'内部错误',error }
		}
	},
	/**
	 * 验证username的唯一性
	 * @param username username
	 * @returns {object} 返回username是否唯一
	 */
	async verifyUniquenessUsername(username) {
		// 参数校验，如无参数则不需要
		if (!username) return {errCode: 'PARAM_IS_NULL',errMsg: '缺少参数'} ;
		const db = uniCloud.databaseForJQL() ;
		const collectionName = "admin" ;
		try{
			const data = await db.collection(collectionName).where({username:username}).get({getOne:true}) ;
			// 返回结果
			return { code:200, message:"校验完成",result:data.affectedDocs }
		}catch(error){
			// 返回结果
			return {message:'内部错误',error }
		}
	},
	
}
